package 微服务.Docker_2.Dockerfile自定义镜像_7;

/**
 * Dockerfile自定义镜像
 */
public class index {
    /**
     * 镜像结构：<p>
     * 首先，镜像是将应用程序及其所需依赖、系统函数库、环境、配置打包而成<p>
     * 所以镜像就包含了应用程序、依赖、系统函数库、配置、环境<p>
     * 而这些东西是有一定的顺序的<p>
     * 如：没有底层的系统函数库已经底层的文件系统，就不能完成环境的配置<p>
     * 没有配置环境变量，就不能完成依赖的安装<p>
     * 没有依赖的安装，就不能完成应用的安装<p>
     * 没有应用的安装，就不能进行应用的配置<p></p>
     * <p>
     * 可见镜像需要将这些东西按照一定的顺序去分层构建<p>
     * 要想构建一个镜像，最底层一定是所依赖的系统函数库，这一层一般称为<a href="">基础镜像（BaseImage）</a>，它包含了应用依赖的系统函数库、环境、配置、文件等<p>
     * 等这些东西安装完之后，镜像还差一个东西：<a href="">入口（Entrypoint）</a>，也就是镜像运行入口，一般是程序启动的脚本和参数<p>
     * 在BaseImage的基础上添加安装包、依赖、配置等，每一次操作都会形成新的一<a href="">层（Layer）</a><p>
     * 分层的作用：在镜像升级时，就不需要重新构建镜像，就可以从未更改的层开始构建，节省时间<p></p><p></p>
     * <p>
     * 如何自定义镜像：<p>
     * 自定义镜像要用到<a href="">Dockerfile</a><p>
     * Dockerfile是一个文本文件，其中包含一个个指令，这些指令就是来描述镜像内部是如何构建的<p>
     * 将来Docker会按照Dockerfile中的指令去构建镜像<p>
     * 每一个指令都会形成一层Layer<p></p>
     * <p>
     * Dockerfile常见指令：<a href="https://docs.docker.com/reference/dockerfile/">更详细的命令</a><p>
     * 1、FROM：指定基础镜像，一般是操作系统，如 FROM centos:6 表示基于centos6去创建<p>
     * 2、ENV：设置环境变量，一般是键值对，一旦配置好之后，在后续的指令中都可以使用（比如可以配置一个目录）。如 ENV key value<p>
     * 3、COPY：拷贝本地文件到镜像的指定目录。如 COPY ./mysql-5.7.rpm /tmp<p>
     * 4、RUN：指向Linux的shell命令，一般是安装命令，比如有什么依赖需要安装或解压。如：RUN yum install gcc<p>
     * 5、EXPOSE：指定容器运行时监听的是什么端口，是给镜像的使用者看的，如我们之前的-p参数进行端口映射。如 EXPOSE 8080<p>
     * 6、ENTRYPOINT：镜像中的启动命令，容器运行时调用，就是一个启动脚本。如Java项目启动：ENTRYPOINT java -jar xx.jar<p></p><p></p>
     * <p>
     * 由于一个Java项目，前n层做的事情都一样（都是安装jdk、配置、环境变量）<p>
     * 所以我们可以提前把这部分构建好，以后就可以根据这个镜像来构建了<p>
     * 而这件事情已经有人做了。有一个名为java:8-alpine的镜像，它就做了上述的事情<p>
     * 这样一来，dockerfile就可以简化了，详见本目录下的Dockerfile
     *
     * @param args
     */
    public static void main(String[] args) {

    }
}
